export default {}

// 实现泛型GetReadonlyKeys<T>，GetReadonlyKeys<T>返回由对象 T 所有只读属性的键组成的联合类型。
type  Equal<A, B> = (<T> () => T extends A ? 1 : 2) extends <T> () => T extends B ? 1 : 2 ? true : false
type GetReadonlyKeys<T> = {
    [K in keyof T]-?: // 先去掉可选修饰符，避免影响比较
    Equal< // Equal 是来自 type-challenges 的工具类型
        { [P in K]: T[P] },            // 原来的属性
        { -readonly [P in K]: T[P] }   // 去掉 readonly 之后的属性
    > extends true
        ? never // 如果相等，说明不是 readonly
        : K     // 不相等，说明是 readonly，保留这个键
}[keyof T]; // 把映射类型的值合并成联合类型


// 那么 不加 [keyof T]，推导结果是：
// type ads = {
//     title: "title";       // 因为是 readonly，所以保留 "title"
//     description: never;   // 不是 readonly，所以是 never
//     completed: never;     // 不是 readonly，所以是 never
// }
interface Todo1 {
    readonly title: string
    description: string
    completed: boolean
}

type ads = GetReadonlyKeys<Todo1>

const asdsa: ads = 'title'